<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 所有对象都继承Object内置方法（除去Obejct.create(null)产生的 ）
    // 所有数组都继承了Array的内置方法，和Object的（Array更深一层是Object）
    // Array没有create


    // 挨个看数组的内置方法(1.作用，2.返回值)
    // 修改原数组：push/unshift   pop/shift   reverse   splice   sort
    // 1.push
    // var a = [1, 2, 3]
    // var b = a.push(4, 5)
    // console.log(a)  // a尾部新增4,5
    // console.log(b) // 返回执行完push之后数组的length


    // 2.unshift
    // var a = [1, 2, 3];
    // var b = a.unshift(4,5);
    // console.log(a);    // a头部新增4,5
    // console.log(b);   // 返回执行完unshift之后数组的length  


    // 3.pop
    // var a = [1, 2, 3, 4, 5, 100];
    // var b = a.pop();
    // console.log(a)  // a的最后一位被删除
    // console.log(b) // 返回最后一位被删除的元素

    // 4.shift
    // var a = [1, 2, 3, 4, 5, 100];
    // var b = a.shift();
    // console.log(a)  // a的第一位被删除
    // console.log(b) // 返回第一位一位被删除的元素


    // 5.reverse
    // var a = [1, 2, 3, 4, 5, 100];
    // var b = a.reverse()
    // console.log(a) // a被倒排
    // console.log(b) // a的倒排

    // 6.splice(开始的下标，被截取的位数，替补的内容)
    // var a = [1, 2, 3, 4, 5, 100];
    // var b = a.splice(2, 2)
    // console.log(a) // 3，4 被清除
    // console.log(b) // 得到3,4

    // var b = a.splice(2, 2, 6,7,8)
    // console.log(a) // 3，4 被替换为6,7,8
    // console.log(b) // 得到3,4

    // 可以把第二个参数设置为0，实现插入指定位置的功能
    // var b = a.splice(2, 0, 999)
    // console.log(a)
    // console.log(b)



    // 7.sort
    // var a = [1, 2, 3, 4, 5, 100];
    // // console.log(a.sort()) // 没有达到理想的排序。因为sort是按照ascii来排序的
    // // sort(function(a,b){
    // //   return ==>  负值 a排前
    // //               正值 b排前
    // //               0    保持不动
    // // })
    // console.log(a.sort((a, b) => a - b)) // 返回负值，则a<b,则a排在前
    // 方法中第一次a=》2  b=》1



    // var a = [
    //   {
    //     age: 10
    //   },
    //   {
    //     age: 5
    //   },
    //   {
    //     age: 1
    //   },
    // ];
    // console.log(a.sort((a, b) => a.age - b.age))



    // 作业
    // Array.prototype.myUnshift = function () {
    //   var pos = 0;
    //   for (let i = 0; i < arguments.length; i++) {
    //     this.splice(pos, 0, arguments[i])
    //     pos++
    //   }
    // }

    // Array.prototype.myUnshift = function () {
    //Array.prototype.slice.call()把类数组转化成数组
    //   let argArr = Array.prototype.slice.call(arguments);
    //   var newArr = argArr.concat(this)
    //   return newArr
    // }

    // var a = [3, 4, 5, 6];
    // var newArr = a.myUnshift(0, 1, 2)
    // console.log(newArr)


    // 请按照字节数排序下列数组
    // var a = ['我爱你', 'OK', 'Hello', '你说WHAT', '可以']
    // a.sort((a, b) => getBytes(a) - getBytes(b))
    // console.log(a)

    // function getBytes(str) {
    //   let len = str.length;
    //   for (let i = 0; i < str.length; i++) {
    //     if (str[i].charCodeAt() > 255) {
    //       len++
    //     }
    //   }
    //   return len
    // }



    // 经典面试题
    // function Foo() {
    //   getName = function () {
    //     console.log(1)
    //   }
    //   return this
    // }
    // Foo.getName = function () {
    //   console.log(2)
    // }
    // Foo.prototype.getName = function () {
    //   console.log(3)
    // }
    // var getName = function () {
    //   console.log(4)
    // }
    // function getName() {
    //   console.log(5)
    // }
    // // 执行Foo.getName ==>2
    // Foo.getName();
    // // 变量提升，5提升了，4覆盖了5，则 ==>4
    // getName();
    // // 执行Foo(),则重新把getName赋值为1，并返回this指向window
    // // 然后执行window.getName 则===>1
    // Foo().getName()
    // // 上面getName被改写为  ===>1
    // getName();
    // //new遇到构造函数()。比.优先执行
    // // Foo.getName ===>2
    // new Foo.getName();
    // // new Foo()的getName执行原型链上的 ==>3
    // new Foo().getName()
    // // new (new Foo().getName)()
    // new new Foo().getName()





    // 数组方法（生成新的数组）
    // 1.concat
    // var a = [1, 2, 3];
    // var b = [4, 5, 6];
    // var c = a.concat(b);
    // var d = b.concat(a);
    // console.log(c);
    // console.log(d);
    // 数组合并

    // 2.toString()
    // var arr = ['a', 'd', 'f'];
    // var arr1 = [1, 2, 3];
    // console.log(arr1.toString()) // 继承Array
    // console.log(Object.prototype.toString.call(arr1)) // 用Object


    // 3.slice  splice
    // var arr = ['a', 'b', 'c', 'd', 'e'];
    // var arr1 = arr.slice(1, 4);//下标截取1-4（有1，无4）
    // console.log(arr) // 保持不变
    // console.log(arr1)

    // 4.join(对象->字符串) / split(字符串->对象)
    // var arr = ['a', 'b', 'c', 'd', 'e'];
    // console.log(arr.join())  // 不传参数，默认用 , 隔开
    // console.log(arr.join('-'))  // 用参数隔开

    // var arrStr = arr.join('-');
    // console.log(arrStr.split('-'))
    // console.log(arrStr.split())  // 不传参数，整体包成数组


    // 重写type
    // 重要在于对object和null的处理
    // function myTypeof(val) {
    //   let type = typeof (val);
    //   let toStr = Object.prototype.toString;
    //   let typeObj = {
    //     '[object Array]': 'array',
    //     '[object Object]': 'object',
    //     '[object Number]': 'object number',
    //     '[object String]': 'object string',
    //     '[object Boolean]': 'object boolean'
    //   }
    //   if (val === null) return null;
    //   if (type === 'object') {
    //     return typeObj[toStr.call(val)]
    //   }
    //   return type;
    // }
    // console.log(myTypeof(1))
    // console.log(myTypeof('1'))
    // console.log(myTypeof(true))
    // console.log(myTypeof(null))
    // console.log(myTypeof(undefined))
    // console.log(myTypeof({}))
    // console.log(myTypeof([]))
    // console.log(myTypeof(new Number(1)))
    // console.log(myTypeof(new String(1)))
    // console.log(myTypeof(new Boolean(1)))


    // 数组去重
    // var arr = [1, 1, 3, 3, 4, 5, 6, 7, 8, 6, 5, 4, 4, 3, 4, 2, '11'];
    // Array.prototype.unique = function () {
    //   let obj = {}, arr = [];
    //   for (let i of this) {
    //     if (!obj.hasOwnProperty(i)) {
    //       obj[i] = this[i]
    //       arr.push(i)
    //     }
    //   }
    //   return arr
    // }
    // let arr2 = arr.unique()
    // console.log(arr2)


    // 字符串去重
    // let str = 'adasdsdadsfdfweerrewrw321321';
    // String.prototype.unique = function () {
    //   let newStr = '',
    //     obj = {};
    //   for (let i = 0; i < this.length; i++) {
    //     if (!obj.hasOwnProperty(this[i])) {
    //       newStr += this[i];
    //       obj[this[i]] = this[i]
    //     }
    //   }
    //   return newStr
    // }
    // let newStr = str.unique()
    // console.log(newStr)


    // 找出没有重复的第一个字符
    // let str = 'adasdsdadsfdfwzeerrewrw321321';
    // String.prototype.unique = function () {
    //   let newStr = '',
    //     obj = {};
    //   for (let i = 0; i < this.length; i++) {
    //     if (!obj.hasOwnProperty(this[i])) {
    //       newStr += this[i];
    //       obj[this[i]] = 1
    //     } else {
    //       obj[this[i]]++
    //     }
    //   }
    //   for (let i in obj) {
    //     if (obj[i] === 1) {
    //       return i
    //     }
    //   }
    // }
    // let newStr = str.unique()
    // console.log(newStr)


    let a = [, , , 1, 3, 4];
    console.log(a[0])

  </script>
</body>

</html>